package com.yuw.utils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Enumeration;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.converters.DateConverter;

public class MyUtils {

	/**
	 * 数据类型转换：将request表单中的数据转换为实体类的属性值。【 要求：form表单的标签控件的name属性名需要和是类的属性名一致（区分大小写）】
	 * 
	 * @param request request请求对象
	 * @param clazz   实体类的Class
	 * @return 获取表单数据的实体类实例对象
	 */
	public static <T> T convertRequest2BeanWithFileUpload(HttpServletRequest request, Class<T> clazz) {
		// 返回值
		T t = null;

		// 给BeanUtils注册类型转换器
		// 处理时间格式
		DateConverter dateConverter = new DateConverter();
		// 设置日期格式
		dateConverter
				.setPatterns(new String[] { "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss" });
		// 注册日期类型的转换器
		ConvertUtils.register(dateConverter, Date.class);

		try {
			// 使用Class创建实体类的一个实例对象
			t = clazz.newInstance();
			// 从request中取出表单值，设置给实体类的同名属性
			if (request != null) {
				// 从request对象中获取所有的表单的name属性的值
				Enumeration<String> formTagNameValues = request.getParameterNames();
				// 遍历每个标签的name属性，使用反射进行赋值
				while (formTagNameValues.hasMoreElements()) {
					// 获取标签的name属性的值
					String tagNameValue = formTagNameValues.nextElement();
					// 使用标签的name属性的值获取该标签的控件的值
					String tagValue = request.getParameter(tagNameValue);
					// 使用BeanUtils进行实体类的属性的反射调用设置
					BeanUtils.setProperty(t, tagNameValue, tagValue);
				}
			}
		} catch (Exception e) {
			// 获取Class实例对象异常
			System.out.println("工具类convertRequest2BeanWithFileUpload方法中异常：");
			e.printStackTrace();
		}
		return t;
	}

	/**
	 * 将日期类型转换为指定格式的字符串 注意：格式串的格式和日期字符串的格式要保持一致，否无法进行转换
	 * 
	 * @param strDate   被转化的日期字符串
	 * @param strFormat 日期字符串的格式
	 * @return 转换之后的日期对象
	 */
	public static Date convertString2Date(String strDate, String strFormat) {
		// 返回值（根据业务需求确定默认的返回值）
		// Date date = new Date();
		Date date = null;
		// 如果格式串为空，则使用默认格式串
		if (strFormat == null) {
			strFormat = "yyyy-MM-dd HH:mm:ss";
		}
		// 创建日期格式化处理类的实例对象
		SimpleDateFormat sdf = new SimpleDateFormat(strFormat);
		try {
			// 进行转换处理
			date = sdf.parse(strDate);
		} catch (ParseException e) {
			// 异常处理
			System.out.println("日期字符串转化为日期对象异常：" + e.getMessage());
		}
		return date;

	}

	/**
	 * 将日期类型转换为指定格式的字符串
	 * 
	 * @param date      被转化的日期类型
	 * @param strFormat 日期字符串的格式
	 * @return 转换之后的日期格式串
	 */
	public static String convertDate2String(Date date, String strFormat) {

		// 返回值
		String strDate = null;

		// 如果格式串为空，则使用默认格式串
		if (strFormat == null) {
			strFormat = "yyyy-MM-dd HH:mm:ss";
		}
		// 创建日期格式化处理类的实例对象
		SimpleDateFormat sdf = new SimpleDateFormat(strFormat);
		// 进行格式化处理
		strDate = sdf.format(date);

		return strDate;
	}
}
